acme_admin_dashboard:
pattern: /{_locale}/admin
defaults: { _controller: AcmeBundle:Admin:dashboard }
このルートに/en/admin
と/en/admin/
でアクセスできるようにしたい。どうすればこれを達成できますか?
@Kuchengeschmackの回答( https://stackoverflow.com/a/11078348/593957 )は、外部リダイレクトをトリガーしないため、気に入っています。
ここにyamlバージョンがあります:
acme_admin_dashboard:
pattern: /{_locale}/admin{trailingSlash}
defaults: { _controller: AcmeBundle:Admin:dashboard, trailingSlash : "/" }
requirements: { trailingSlash : "[/]{0,1}" }
入力するだけです:
/**
* @Route("/route/of/some/page/")
*/
そう
www.example.com/route/of/some/page
そして
www.example.com/route/of/some/page/
受け入れられます...
ルートに末尾のスラッシュを追加する解決策を見つけました。
両方のリンクが機能していることを意味しますwww.example.com/route/of/some/page
およびwww.example.com/route/of/some/page/
。あなたができることはこの方法です:
ルートが次のようになっている場合
/**
* @Route("/route/of/some/page")
*/
public function pageAction() {
に変更する
/**
* @Route("/route/of/some/page{trailingSlash}", requirements={"trailingSlash" = "[/]{0,1}"}, defaults={"trailingSlash" = "/"})
*/
public function pageAction() {
.htaccessファイルで書き換えルールを使用することもできます。
次のようなルートを定義したとします。
news:
url: /news
param: { module: news, action: index }
これは http://something.something/news では一致しませんが、 http://something.something/news/ では一致しません。末尾のスラッシュ。ただし、.htaccessファイルでこの書き換えルールを使用することもできます。
RewriteRule ^(.+)/$ http://%{HTTP_Host}/$1 [R=301,L]
http://symfony-blog.driebit.nl/2010/07/url-routes-with-or-without-a-trailing-slash/
次の行をフロントコントローラーにハックしました(app.php/app_dev.php)
_$_SERVER['REQUEST_URI'] = preg_replace('|/$|', '', $_SERVER['REQUEST_URI'], 1);
_
$request = Request::createFromGlobals()
の前
ルート:
remove_trailing_slash:
path: /{url}
defaults: { _controller: AppBundle:Redirecting:removeTrailingSlash }
requirements:
url: .*/$
methods: [GET]
コントローラー:
// src/AppBundle/Controller/RedirectingController.php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class RedirectingController extends Controller
{
public function removeTrailingSlashAction(Request $request)
{
$pathInfo = $request->getPathInfo();
$requestUri = $request->getRequestUri();
$url = str_replace($pathInfo, rtrim($pathInfo, ' /'), $requestUri);
return $this->redirect($url, 301);
}
}
続きを読む: http://symfony.com/doc/current/routing/redirect_trailing_slash.html
新しいSFバージョンの場合:
デフォルトでは、Symfonyルーティングコンポーネントでは、パラメーターが次の正規表現パスと一致する必要があります:[^/]+
。つまり、/
を除くすべての文字が許可されます。
より寛容な正規表現パスを指定して、/
をパラメーターの一部として明示的に許可する必要があります。
YAML:
_hello:
path: /hello/{username}
defaults: { _controller: AppBundle:Demo:hello }
requirements:
username: .+
XML:
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="_hello" path="/hello/{username}">
<default key="_controller">AppBundle:Demo:hello</default>
<requirement key="username">.+</requirement>
</route>
</routes>
PHP:
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$collection = new RouteCollection();
$collection->add('_hello', new Route('/hello/{username}', array(
'_controller' => 'AppBundle:Demo:hello',
), array(
'username' => '.+',
)));
return $collection;
注釈:
/**
* @Route("/hello/{username}", name="_hello", requirements={"username"=".+"})
*/
public function helloAction($username)
{
// ...
}