我真的在这个系绳的尽头。我已经在stackoverflow上研究了许多其他问题和答案,但仍然无法找到我需要的解决方案。我开始认为我想做的事情是不可能的。
所以......问题就在于此。我想转向以下内容: e.g。
www.mydomain.com/visa-information/country.php?country={COUNTRY-NAME}&passport={PASSPORT-NAME}
到以下漂亮的网址:
www.mydomain.com/visa-information/{COUNTRY-NAME}-visa-for-{PASSPORT-NAME}-citizens/
我的htacces文件中有一个部分成功的规则:
RewriteRule ^/visa-information/([A-Za-z-]+)-visa-for-([A-Za-z-]+)-citizens/?$ visa-information/country.php?country=$1&passport=$2 [NC]
哪个工作正常,如果我将URL输入到浏览器地址栏中,我想要的是什么,但我真正的问题是让它通过我几乎每个人的形式重新指向漂亮的URL该网站的页面。
我尝试了各种重新直接规则,如下所示:
RewriteCond %{QUERY_STRING} country=([A-Za-z-]+)&passport=([A-Za-z-]+) [NC]
RewriteRule visa-information/country.php visa-information/%1-visa-for-%2-citizens/? [R,NC,L]
但没有运气。我也尝试将QSA标志添加到上面的重定向规则中,但它最终会以无限循环结束。
我尝试在country.php页面的顶部使用位置php重定向标题,在表单提交后重新定向,如下所示:
if(isset($_GET['country']) && isset($_GET['passport'])) {
header("Location: " . $dir . "/visa-information/" . $currentCountry . "-visa-for-" . $currentPassport . "-citizens/");
exit();
}
我期待上面的工作就像直接在浏览器中输入漂亮的网址一样,但事实并非如此,只是给了我404错误。
非常感谢任何帮助。
由于
Jordash
修改
我的本地目录结构如下:
/webserver/mydomain.com/visa-information/etc...
在实时服务器上它将是:
mydomain.com/visa-information/etc..
当我在本地机器上使用Apache Alias时,我将RewriteBase设置为:
RewriteBase /webserver/mydomain.com/
我目前有以下一套RewriteRules改编自anubhava给我的内容:
RewriteCond %{REQUEST_URI} visa-information/country.php [NC]
RewriteCond %{QUERY_STRING} country=([A-Za-z-]+)&passport=([A-Za-z-]+) [NC]
RewriteRule visa-information/ visa-information/%1-visa-for-%2-citizens/? [R=301,L,QSA]
# internal redirect from pretty URL to old URL
RewriteRule ^visa-information/([A-Za-z-]+)-visa-for-([A-Za-z-]+)-citizens/?$ visa-information/country.php?country=$1&passport=$2 [NC,L]
这当前给了我一个无限的重定向循环,无论是在浏览器栏中输入漂亮的网址,还是在使用我的表单时,如果我禁用前三条规则,那么我发现我可以输入漂亮的网址到地址栏和重写工作,但当然不是从表单提交。
我真的不知道我做错了什么。为什么会出现无限循环?
答案 0 :(得分:0)
由于RewriteRule
与.htaccess
中的前导斜杠不匹配,因此不确定第一条规则对您有何影响。另外,要将旧网址重定向到漂亮的网址,您需要使用THE_REQUEST
变量来表示Apache从您的浏览器收到的原始请求。用以下代码替换您的代码:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# external redirect from old URL to pretty URL
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+visa-information/country\.php\?country=([^\s&]+)&passport=([^\s&]+)\s [NC]
RewriteRule ^ /visa-information/%1-visa-for-%2-citizens/? [R=301,L]
# internal redirect from pretty URL to old URL
RewriteRule ^visa-information/([a-z-]+)-visa-for-([a-z-]+)-citizens/?$ /visa-information/country.php?country=$1&passport=$2 [NC,L,QSA]
答案 1 :(得分:0)
看起来问题实际上是我的php表单而不是mod_Rewrite规则。表单“action”指向同一个表单页面(如$ SERVER ['PHP_SELF']中),它在没有重写规则的情况下工作正常,但在激活时会导致无限循环。
我只是创建了一个search_action.php页面,然后使用php标头将表单重定向到漂亮的URL:
header("Location: " . $dir . "/visa-information/" . $currentCountry . "-visa-for-" . $currentPassport . "-citizens/");
exit();
我最初的mod_rewrite规则工作正常,现在用户可以使用表单中的漂亮网址或直接进入浏览器地址栏到达所需页面。
我不确定实际上可以在重写查询字符串的同时将表单操作到同一页面,而无需使用表单中的中间操作页面或Javascript。我相信很多经验丰富的程序员已经知道了这一点,但不幸的是我不知道。